//FWK.include("FWK.Misc.coord");			//需要载入coord包
//FWK.include("FWK.Misc.Element_Basc");		//需要载入Element基本包
/**
 * 使用蒙板
 * 第一次使用，请先执行FWK.PageMask.init() 初始化蒙板
 */
FWK.PageMask = {
	zIndex:999000,
	showNum:0,
	inited:false,
	divMask:FWK.createElement("div",{}),
	/**
	 * 第一次使用，请先调用我 初始化
	 * 如果是IE6 自动增加iframe到Div
	 */
	init:function(color,alpha){
		color = color || "#000";
		alpha = alpha || 20;
		if(this.inited){
			//FWK.Element.setStyle.call(this.divMask,{backgroundColor:color,filter:"alpha(opacity="+alpha+")",opacity:alpha/100});
		}
		else{
			FWK.Element.setStyle.call(this.divMask,{zIndex:this.zIndex,position:"absolute",top:"0px",left:"0px",display:"none",padding:"0px",margin:"0px",backgroundColor:color,filter:"alpha(opacity="+alpha+")",opacity:String(alpha/100),overflow:"hidden",width:0,height:0});
			document.body.appendChild(this.divMask);
			if(FWK.isIE6){
				var iframe = FWK.createElement("iframe",{style:{filter:"alpha(opacity=0)",opacity:0,overflow:"hidden",width:0,height:0}});
				this.divMask.appendChild(iframe);
			}
		}
		this.inited = true;
	},
	/**
	 * 显示蒙板层
	 */
	show:function(){
		if(!this.inited){
			this.init();
		}
		if(this.divMask.style.display == "block"){
			this.showNum +=1;
			return;
		}
		var Screen = FWK.getScreen();
		FWK.Element.setStyle.call(this.divMask,Screen);

		if(FWK.isIE6) {
			FWK.Element.setStyle.call(this.divMask.firstChild,Screen);
		}
		this.divMask.style.display = "block";
		FWK.addEvent(window,"resize",FWK.PageMask.reSize);
	},
	/**
	 * 如果蒙板正在显示中 调用我，会重新计算蒙板的宽和高
	 * 如果蒙板隐藏 调用无效
	 */
	reSize:function(){
		if(!FWK.PageMask.inited || FWK.PageMask.divMask.style.display=="none")return;
		var Screen = FWK.getScreen();
		FWK.Element.setStyle.call(FWK.PageMask.divMask,Screen);
		if (FWK.isIE6) {
			FWK.Element.setStyle.call(FWK.PageMask.divMask.firstChild,Screen);
		}
	},
	/**
	 * 隐藏蒙板
	 */
	hidden:function(){
		if(!this.inited || this.divMask.style.display == "none"){
			return ;
		}
		if(this.showNum>=1){
			this.showNum -=1;
			return ;
		}
		this.divMask.style.display = "none";
		FWK.Element.setStyle.call(this.divMask,{width:0,height:0});
		if(FWK.isIE6) {
			FWK.Element.setStyle.call(this.divMask.firstChild,{width:0,height:0});
		}
		FWK.removeEvent(window,"resize",this.reSize);
	}
}

FWK.extend(FWK.Element,{
	/**
	 * 增加浮动层
	 * @param {Boolen} mask 	是否需要蒙板
	 * @param {Boolen} resize 	是否需要浏览器改变大小时自动定位 event不支持自动定位
	 * @param {Dom String Number event} type 	定位 定位顺序 (left top) string
	 * # Dom 以Dom定点为基点 后跟x y 作为其偏移量
	 * # String 转换为Dom 后跟Dom一样操作
	 * # Num >1 绝对定位 left right
	 * # 0<Num<=1 百分比定位 left right
	 * # event 鼠标事件定位 再后跟 x y 作为偏移量
	 * # 空 绝对居中
	 */
	addFloat:function(mask,resize,type){
		if (mask) {
			FWK.PageMask.show();
			this.mask = true;
		}
		if(this.parentNode!=document.body){
			document.body.appendChild(this);
		}
		FWK.Element.setStyle.call(this,{display:"block",position:"absolute",zIndex:String(++FWK.PageMask.zIndex)});
		var po = FWK.DoElement.reSize.apply(this,Array.prototype.slice.call(arguments,2));
		if(resize && (!type || FWK.isEl(type) || FWK.isStr(type) || FWK.isNum(type))){
			var rs = Array.prototype.slice.call(arguments,2);
			if(rs.length==0){
				rs.push(null);
			}
			this.reSize = FWK.DoElement.reSize.bind(this,rs);
			FWK.addEvent(window,"resize",this.reSize);
		}

		this.zindex = FWK.DoElement.zIndex.bind(this);
		FWK.addEvent(this,"click",this.zindex);
		return po;
	},
	/**
	 * 去除浮动层
	 * @param {Bollen} _maskFlag	是否需要去除蒙板
	 * 使用：FWK.Element.removeFloat.call(Dom,_maskFlag)或者Dom.removeFloat(_maskFlag,_x,_y)<如果此Dom有removeFloat方法的话>
	 */
	removeFloat:function(){
		FWK.Element.setStyle.call(this,{display:"none"});
		if(this.reSize){
			FWK.removeEvent(window,"resize",this.reSize);
			this.reSize = null;
		}

		if(this.zindex){
			FWK.removeEvent(this,"click",this.zindex);
			this.zindex = null;
		}
		if (this.mask) {
			FWK.PageMask.hidden();
			this.mask = null;
		}
	},
	/**
	 * 增加绝对居中的浮动层 并自动 Scroll
	 * @param 同 addFloat
	 * 使用：FWK.Element.addScroll.call(Dom,_maskFlag,_x,_y)或者Dom.addScroll(_maskFlag,_x,_y)<如果此Dom有addScroll方法的话>
	 */
	addScroll:function(){
		var position = FWK.Element.addFloat.apply(this,arguments);
		this.moveScroll = FWK.DoElement.moveScroll.bind(this,[position.left-document.documentElement.scrollLeft,position.top-document.documentElement.scrollTop]);
		FWK.Element.addEvent.call(window,"scroll",this.moveScroll);
	},
	/**
	 * 去除浮动层  并去除自动 Scroll
	 * @param {Bollen} _maskFlag	是否需要去除蒙板
	 * 使用：FWK.Element.removeScroll.call(Dom,_maskFlag)或者Dom.removeScroll(_maskFlag,_x,_y)<如果此Dom有removeScroll方法的话>
	 */
	removeScroll:function(){
		FWK.Element.removeEvent.call(window,"scroll",this.moveScroll);
		this.moveScroll = null;
		FWK.Element.removeAtt.call(this,"moveScroll");
		FWK.Element.removeFloat.call(this);
	},
	/**
	 * 增加绝对居中的浮动层 并且可以Drag
	 * @param {Dom | String}_title	能获取鼠标点击事件的 Dom
	 * @param 以后 参数同 addFloat
	 * 使用：FWK.Element.addDrag.call(Dom,_maskFlag,_x,_y)或者Dom.addDrag(_maskFlag,_x,_y)<如果此Dom有addDrag方法的话>
	 */
	addDrag:function(_title){
		_title = FWK.elementQuery(_title);
		var position = FWK.Element.addFloat.apply(this,Array.prototype.slice.call(arguments,1));
		_title.beninDrag = FWK.DoElement.beginDrag.bind(this,[_title]);
		_title.endDrag = FWK.DoElement.endDrag.bind(this,[_title]);
		FWK.Element.addEvent.call(_title,"mousedown",_title.beninDrag);
		_title.style.cursor="move";
	},
	/**
	 * 去除浮动层  并且去除Drag
	 * @param {Dom | String}_title	能获取鼠标点击事件的 Dom
	 * @param {Bollen} _maskFlag	是否需要去除蒙板
	 * 使用：FWK.Element.removeDrag.call(Dom,_maskFlag)或者Dom.removeDrag(_maskFlag,_x,_y)<如果此Dom有removeDrag方法的话>
	 */
	removeDrag:function(_title){
		FWK.Element.removeEvent.call(_title,"mousedown",_title.beninDrag);
		_title.beninDrag = null;
		_title.endDrag = null;
		FWK.Element.removeAtt.call(_title,["beninDrag","endDrag"]);
		FWK.Element.removeFloat.call(this);
	},
	/**
	 * 增加绝对居中的浮动层 并且可以Drag 和 Scrool
	 * @param {Dom | String}_title	能获取鼠标点击事件的 Dom
	 * @param 以后同 addFloat
	 * 使用：FWK.Element.addSDrag.call(Dom,_maskFlag,_x,_y)或者Dom.addDrag(_maskFlag,_x,_y)<如果此Dom有addDrag方法的话>
	 */
	addSDrag:function(_title){
		var position = FWK.Element.addFloat.apply(this,Array.prototype.slice.call(arguments,1));
		this.moveScroll = FWK.DoElement.moveScroll.bind(this,[position.left-document.documentElement.scrollLeft,position.top-document.documentElement.scrollTop]);
		FWK.Element.addEvent.call(window,"scroll",this.moveScroll);

		_title = FWK.elementQuery(_title);
		_title.beninDrag = FWK.DoElement.beginSDrag.bind(this,[_title]);
		_title.endDrag = FWK.DoElement.endSDrag.bind(this,[_title]);
		FWK.Element.addEvent.call(_title,"mousedown",_title.beninDrag);
		_title.style.cursor="move";
	},
	/**
	 * 去除浮动层  并且去除Drag 和 Scroll
	 * @param {Dom | String}_title	能获取鼠标点击事件的 Dom
	 * @param {Bollen} _maskFlag	是否需要去除蒙板
	 * 使用：FWK.Element.removeDrag.call(Dom,_maskFlag)或者Dom.removeDrag(_maskFlag,_x,_y)<如果此Dom有removeDrag方法的话>
	 */
	removeSDrag:function(_title){
		FWK.Element.removeEvent.call(window,"scroll",this.moveScroll);
		this.moveScroll = null;
		FWK.Element.removeAtt.call(this,"moveScroll");

		FWK.Element.removeDrag.call(this,_title);
	},
	addMenu:function(){
		FWK.Element.addFloat.apply(this,arguments);
		if(!this.close){
			this.close = FWK.DoElement.removeMenu.bind(this,[arguments[1]]);
			FWK.Element.addEvent.call(document,"mousemove",this.close);
		}
	},
	removeMenu:function(){
		FWK.Element.removeEvent.call(document,"mousemove",this.close);
		this.close = null;
		FWK.Element.removeFloat.call(this);
	}
});
/**
 * 以下在使用中 没有实际应用 只是为 Scroll 和 Drag 服务的
 */
FWK.DoElement = {
	reSize:function(){
		var type = FWK.isStr(arguments[0])?$(arguments[0]):arguments[0];
		var flag = true;
		if(FWK.isEl(type)){
			var position = FWK.Element.getCoord.call(type);
			var left = position.left + (FWK.isNum(arguments[1])?arguments[1]:0);
			var top = position.top + (FWK.isNum(arguments[2])?arguments[2]:0);
		}
		else if(FWK.isNum(type)){
			if(0<=type && type<=1){
				var left = (document.documentElement.clientWidth - this.clientWidth)*type + document.documentElement.scrollLeft + (FWK.isNum(arguments[3])?arguments[3]:0);
			}
			else{
				var left = type;
			}

			if(0<=arguments[1] && arguments[1]<=1){
				var top = (document.documentElement.clientWidth - this.clientWidth)*arguments[1] + document.documentElement.scrollLeft + (FWK.isNum(arguments[4])?arguments[4]:0);
			}
			else{
				var top = arguments[1];
			}
		}
		else if(type){
			var ms = FWK.getMsCoord(type);
			var left = ms.x + (FWK.isNum(arguments[1])?arguments[1]:0);
			var top = ms.y + (FWK.isNum(arguments[2])?arguments[2]:0);
		}
		else{//居中
			var left = (document.documentElement.clientWidth - this.clientWidth)/2 + document.documentElement.scrollLeft + (FWK.isNum(arguments[1])?arguments[1]:0);
			var top = (document.documentElement.clientHeight - this.clientHeight)/2 + document.documentElement.scrollTop + (FWK.isNum(arguments[2])?arguments[2]:0);
		}
		FWK.Element.setStyle.call(this,{left:left + "px",top:top + "px"});
		return {left:left,top:top};
	},
	//上浮用 zIndex++
	zIndex:function(){
		if(FWK.PageMask.showNum>0){
			this.style.zIndex = String(++FWK.PageMask.zIndex);
		}
	},
	//Scroll 用
	moveScroll:function(_left,_top){
		FWK.Element.setStyle.call(this,{left:_left + document.documentElement.scrollLeft + "px",top:_top + document.documentElement.scrollTop + "px"});
	},
	//拖动用
	moveDrag:function(_left,_top,_ev){
		var mp = FWK.getMsCoord(_ev);
		FWK.Element.setStyle.call(this,{left:_left + mp.x + "px",top:_top + mp.y + "px"});
	},
	beginDrag:function(_title,_ev){
		var mp = FWK.getMsCoord(_ev);
		if(this.moveDrag)return;	//防止第一个键还没有弹开 第二个键已经按下
		var position = FWK.Element.getCoord.call(this);
		this.moveDrag = FWK.DoElement.moveDrag.bind(this,[position.left-mp.x,position.top-mp.y]);
		FWK.Element.addEvent.call(document.body, "mousemove",this.moveDrag);
		FWK.Element.addEvent.call(document.body, "mouseup",_title.endDrag);
	},
	endDrag:function(_title){
		FWK.Element.removeEvent.call(document.body, "mousemove", this.moveDrag);
		this.moveDrag = null;
		FWK.Element.removeAtt.call(_title,"moveDrag");
		FWK.Element.removeEvent.call(document.body, "mouseup", _title.endDrag);
	},
	//滚动加拖动用
	beginSDrag:function(_title,_ev){
		var mp = FWK.getMsCoord(_ev);
		if(this.moveDrag)return;	//防止第一个键还没有弹开 第二个键已经按下

		FWK.Element.removeEvent.call(window,"scroll",this.moveScroll);
		this.moveScroll = null;
		FWK.Element.removeAtt.call(this,"moveScroll");

		var position = FWK.Element.getCoord.call(this);
		this.moveDrag = FWK.DoElement.moveDrag.bind(this,[position.left-mp.x,position.top-mp.y]);
		FWK.Element.addEvent.call(document.body, "mousemove",this.moveDrag);
		FWK.Element.addEvent.call(document.body, "mouseup",_title.endDrag);
	},
	endSDrag:function(_title){
		FWK.Element.removeEvent.call(document.body, "mousemove", this.moveDrag);
		this.moveDrag = null;
		FWK.Element.removeAtt.call(_title,"moveDrag");
		FWK.Element.removeEvent.call(document.body, "mouseup", _title.endDrag);

		var position = FWK.Element.getCoord.call(this);
		this.moveScroll = FWK.DoElement.moveScroll.bind(this,[position.left-document.documentElement.scrollLeft,position.top-document.documentElement.scrollTop]);
		FWK.Element.addEvent.call(window,"scroll",this.moveScroll);
	},
	removeMenu:function(_maskFlag,_ev){
		_ev = _ev || window;
		if (FWK.isIE) {
			var el = _ev.srcElement;
		}
		else{
			var el = _ev.target;
		}
		if(!el){
			FWK.Element.removeMenu.call(this,_maskFlag);
		}
		else{
			while(el){
				if(el==this){
					break;
				}
				el = el.parentNode;
			}
			if(el){

			}
			else{
				FWK.Element.removeMenu.call(this,_maskFlag);
			}
		}
	}
};